﻿#region License

// This file is part of Grawlix.
// 
// Grawlix is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as
// published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
// Grawlix is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public
// License along with Grawlix.  If not, see
// <http://www.gnu.org/licenses/>.

#endregion

using System;
using Castle.Windsor;

namespace Grawlix.Services
{
	/// <summary>
	/// A factory for <see cref="GameKernel"/> objects that gives
	/// them separate <see cref="AppDomain"/> boundaries.
	/// </summary>
	[Serializable]
	public class DefaultGameKernelFactory :
		ServiceBase<IGameKernelFactory>, IGameKernelFactory
	{
		/// <summary>
		/// Creates a new game with the specified name.
		/// </summary>
		/// <param name="name">The name of the world to load.</param>
		/// <param name="parentKernel">The parent kernel to use.</param>
		/// <param name="configPath">The path to the world
		/// configuration.</param>
		/// <param name="searchPaths">The paths to search for
		/// assemblies.</param>
		/// <returns>A proxy to a new game object.</returns>
		public ExternalProxy<IGameKernel> Create(string name,
		                                         IWindsorContainer
		                                         	parentKernel,
		                                         string configPath,
		                                         string
		                                         	searchPaths)
		{
			var environment = new AppDomainEnvironment(name,
			                                           AppDomain.
			                                           	CurrentDomain
			                                           	.
			                                           	BaseDirectory,
			                                           searchPaths);
			return new ExternalProxy<IGameKernel>(environment,
			                                      typeof(GameKernel),
			                                      name, configPath, parentKernel);
		}
	}
}